package com.woniu.controller;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;

import com.woniu.entity.Order;
import com.woniu.entity.OrderModel;
import com.woniu.service.AliPayService;
import com.woniu.service.impl.UserServiceImpl;
import com.woniu.utils.PayUtil;
import com.woniu.utils.ResultObj;
import com.woniu.utils.SnowflakeIdGenerator;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 支付宝沙箱支付
 */
@CrossOrigin
@RestController
@RequestMapping("/alipay")
public class AliPayController {
    //定义全局变量
    private int id;
    private int uid;
    // 设置id的方法
    public void setId(int value) {
        this.id = value;  // 使用this关键字引用当前对象的id变量
    }
    public void setUid(int value) {
        this.id = value;  // 使用this关键字引用当前对象的id变量
    }

    @Autowired
    private PayUtil payUtil;

    private OrderModel orderModels = null;
    private String tokens = "";
    @Autowired
    private UserServiceImpl userServiceImpl;
    @Autowired
    AliPayController aliPayController;
    @Autowired
    private AliPayService aliPayService;


    /**
     * 支付宝沙箱支付---立即支付,传输支付方式
     */
    @ResponseBody
    @PostMapping("/pay")
    public String alipay(@RequestHeader String token, @RequestBody OrderModel orderModel) throws AlipayApiException {
        System.out.println("传过来的信息"+orderModel);
        System.out.println("传过来的付款方式是："+orderModel.getPay_method());
        System.out.println("用户token是"+token);
        System.out.println("用户的id是"+orderModel.getUserId());
        System.out.println("支付宝开始调用...");
        System.out.println("用户的支付方式为："+orderModel.getPay_method());
        //给全局变量赋值
        aliPayController.setId(orderModel.getUserId());
        aliPayController.setUid(orderModel.getUserId());
        orderModels = orderModel;
        double orderPrice = orderModel.getOrderPrice();
        System.out.println("金额" + orderPrice);
        tokens = token;
//      生成订单号（支付宝的要求？）
        /**
         * 生成订单order，需要时间，uid，封装成order，
         */
        // 创建 SnowflakeIdGenerator 实例，传入数据中心ID和机器ID（范围0~31）
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);
        // 生成雪花ID
        long snowflakeId = idGenerator.nextId();
        // 添加前缀 "WONIUXY"---输出结果---生成的订单id
        String OrderNum = "WONIUXY" + snowflakeId;

        // 创建订单对象
        //开始拼凑订单支付成功后的逻辑：生成order,状态为已付款
        Order order = new Order();
        order.setOrderId(OrderNum);
        order.setOrderMethod(orderModel.getPay_method());
        order.setUserId(orderModel.getUserId());
        order.setPrice(BigDecimal.valueOf(orderPrice));
        order.setStatus(0); // 0表示已支付
        order.setOrderSource("网页"); // 根据实际情况设置
        order.setCreateTime(new Date());
        order.setPayTime(new Date());
        order.setUpdateTime(new Date());
        order.setCreater(String.valueOf(orderModel.getUserId()));
        order.setUpdater(String.valueOf(orderModel.getUserId()));
        order.setRemark(orderModel.getRemark());

        // 保存订单到数据库
        aliPayService.saveOrder(order);
        // 遍历课程ID并保存到中间表
        if (orderModel.getCourses() != null && !orderModel.getCourses().isEmpty()) {
            for (OrderModel.CourseItem course : orderModel.getCourses()) {
                // 将Long转换为Integer,这是因为表和实体类不tmd一样！真服了
                Integer courseId = course.getId() != null ? course.getId().intValue() : null;
                aliPayService.saveOrderCourse(OrderNum, courseId);
            }
        }
        //现在订单已经成功支付了
        //开始插入数据到用户和课程表里面
        if (orderModel.getCourses() != null && !orderModel.getCourses().isEmpty()) {
            for (OrderModel.CourseItem course : orderModel.getCourses()) {
                // 将Long转换为Integer,这是因为表和实体类不tmd一样！真服了
                Integer courseId = course.getId() != null ? course.getId().intValue() : null;
                aliPayService.insertIntoUserCourse(orderModel.getUserId(),courseId);
            }
        }
        float oderValue = (float) orderPrice;
        System.out.println("订单金额是" + oderValue);
        System.out.println("订单说明：" + orderModel.getIdleItem());
        System.out.println("订单金额是" + oderValue);
        //商品名字
        System.out.println("订单说明：" + orderModel.getIdleItem());
        //调用封装好的方法（给支付宝接口发送请求）----这个方法直接调用支付宝开始成功付款
        return payUtil.sendRequestToAlipay(OrderNum, oderValue, orderModel.getIdleItem(),orderModel.getUserId());
    }
    //    当我们支付完成之后跳转这个请求并携带参数，我们将里面的订单id接收到，通过订单id查询订单信息，信息包括支付是否成功等

    /**
     * 支付成功之后跳转的页面---成功逻辑
     */
    @PostMapping("/toSuccess")
    public String returns(String out_trade_no) throws ParseException {
        System.out.println("用户id是" + this.id);
        System.out.println("订单号是" + out_trade_no);
        // 查询订单信息
        String query = payUtil.query(out_trade_no);
        System.out.println("==>" + query);
        // 解析支付宝返回的数据
        JSONObject jsonObject = JSONObject.parseObject(query);
        Object o = jsonObject.get("alipay_trade_query_response");
        Map map = (Map) o;
        System.out.println("解析支付宝返回的数据"+map);
        Object s = map.get("trade_status");
        if (s.equals("TRADE_SUCCESS")) {
            System.out.println("订单支付成功");
            //下面的写了没啥用
            return "redirect:http://localhost:5173/front/courseView/success" + orderModels.getUserId();
        } else {
            System.out.println("订单支付失败");
            //写了没啥用
            return "redirect:http://localhost:5173/front/courseView/faile" + orderModels.getUserId();
        }
    }

    @ResponseBody
    @PostMapping("/nopay")
    public String nopay(@RequestHeader String token, @RequestBody OrderModel orderModel) throws AlipayApiException {
        System.out.println("传过来的信息"+orderModel);
        System.out.println("用户token是"+token);
        System.out.println("用户的id是"+orderModel.getUserId());

//      生成订单号（支付宝的要求？）
        /**
         * 生成订单order，需要时间，uid，封装成order，
         */
        // 创建 SnowflakeIdGenerator 实例，传入数据中心ID和机器ID（范围0~31）
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);
        // 生成雪花ID
        long snowflakeId = idGenerator.nextId();
        // 添加前缀 "WONIUXY"---输出结果---生成的订单id
        String OrderNum = "WONIUXY" + snowflakeId;
        // 创建订单对象(待支付状态)
        Order order = new Order();
        order.setOrderId(OrderNum);
        order.setUserId(orderModel.getUserId());
        order.setPrice(BigDecimal.valueOf(orderModel.getOrderPrice()));
        order.setStatus(1); // 1表示待支付
        order.setOrderSource("网页"); // 根据实际情况设置
        order.setCreateTime(new Date());
        order.setUpdateTime(new Date());
        order.setCreater(String.valueOf(orderModel.getUserId()));
        order.setUpdater(String.valueOf(orderModel.getUserId()));
        order.setRemark(orderModel.getRemark());

        // 保存订单到数据库
        aliPayService.saveOrder(order);

        // 遍历课程ID并保存到中间表
        if (orderModel.getCourses() != null && !orderModel.getCourses().isEmpty()) {
            for (OrderModel.CourseItem course : orderModel.getCourses()) {
                // 将Long转换为Integer,这是因为表和实体类不kao一样！真服了
                Integer courseId = course.getId() != null ? course.getId().intValue() : null;
                aliPayService.saveOrderCourse(OrderNum, courseId);
            }
        }
        return "订单创建成功，待支付";
    }

    /**
     * 获取用户余额
     */
    @GetMapping("/balance")
    public ResultObj getUserBalance(@RequestParam Integer userId) {
        BigDecimal balance = aliPayService.getUserBalance(userId);
        System.out.println("用户id为："+userId+"的用户余额为："+balance);
        return ResultObj.ok(balance);
    }

    /**
     *修改用户余额
     */
    @PostMapping("/killbalance")
    public String killBalance(@RequestHeader String token, @RequestBody OrderModel orderModel) {
        System.out.println("传过来的信息"+orderModel);
        System.out.println("传过来的付款方式是："+orderModel.getPay_method());
        System.out.println("用户token是"+token);
        System.out.println("用户的id是"+orderModel.getUserId());
        BigDecimal balance = aliPayService.getUserBalance(orderModel.getUserId());
        System.out.println("用户现在余额是："+balance);
        System.out.println("用户账单总价是："+orderModel.getOrderPrice());
        // 扣除余额业务逻辑
        BigDecimal nowBalance = balance.subtract(new BigDecimal(String.valueOf(orderModel.getOrderPrice())));
        System.out.println("扣除后的金额："+nowBalance);
        //开始执行sql
        aliPayService.killBalance(orderModel.getUserId(),nowBalance);
        System.out.println("更新余额成功：现在用户余额为："+aliPayService.getUserBalance(orderModel.getUserId()));
        //生成订单
        /**
         * 生成订单order，需要时间，uid，封装成order，
         */
        // 创建 SnowflakeIdGenerator 实例，传入数据中心ID和机器ID（范围0~31）
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1, 1);
        // 生成雪花ID
        long snowflakeId = idGenerator.nextId();
        // 添加前缀 "WONIUXY"---输出结果---生成的订单id
        String OrderNum = "WONIUXY" + snowflakeId;
        // 创建订单对象
        //开始拼凑订单支付成功后的逻辑：生成order,状态为已付款
        Order order = new Order();
        order.setOrderId(OrderNum);
        order.setUserId(orderModel.getUserId());
        order.setOrderMethod(orderModel.getPay_method());
        order.setPrice(BigDecimal.valueOf(orderModel.getOrderPrice()));
        order.setStatus(0); // 0表示已支付
        order.setOrderSource("网页"); // 根据实际情况设置
        order.setCreateTime(new Date());
        order.setPayTime(new Date());
        order.setUpdateTime(new Date());
        order.setCreater(String.valueOf(orderModel.getUserId()));
        order.setUpdater(String.valueOf(orderModel.getUserId()));
        order.setRemark(orderModel.getRemark());

        // 保存订单到数据库
        aliPayService.saveOrder(order);

        // 遍历课程ID并保存到中间表
        if (orderModel.getCourses() != null && !orderModel.getCourses().isEmpty()) {
            for (OrderModel.CourseItem course : orderModel.getCourses()) {
                // 将Long转换为Integer,这是因为表和实体类不tmd一样！真服了
                Integer courseId = course.getId() != null ? course.getId().intValue() : null;
                aliPayService.saveOrderCourse(OrderNum, courseId);
            }
        }
        //开始插入数据到用户和课程表里面
        if (orderModel.getCourses() != null && !orderModel.getCourses().isEmpty()) {
            for (OrderModel.CourseItem course : orderModel.getCourses()) {
                // 将Long转换为Integer,这是因为表和实体类不tmd一样！真服了
                Integer courseId = course.getId() != null ? course.getId().intValue() : null;
                aliPayService.insertIntoUserCourse(orderModel.getUserId(),courseId);
            }
        }
        return "操作成功"; // 或者返回更结构化的响应
    }

    // 创建DTO类来接收请求体
    @Data // 使用Lombok注解，如果没有可以手动生成getter/setter
    public class KillBalanceRequest {
        private Integer userId;
        private BigDecimal amount;
        private List<CourseDTO> courses;
        private String remark;
    }

    @Data
    public class CourseDTO {
        private Long id;
        private String title;
        private BigDecimal price;
    }
}
